//饿汉
class Singleton {
    public static Singleton singleton = new Singleton();

    public static Singleton instance() {
        return singleton;
    }

    private Singleton() {

    }
}

//懒汉
class SingletonLazy {
    //防止出现内存可见性,指令重排序问题
    volatile private static SingletonLazy singletonLazy = null;

    public static SingletonLazy instance() {

        // 2.优化
        // 在创建好对象以后线程就安全了也就不需要频繁加锁了(加锁影响程序的效率),
        // 通过这个判断就可以让创建好对象的情况下不再加锁,直接返回
        if(singletonLazy == null) {
            //1.打包成原子性的执行程序,进行锁竞争这样就不会出现线程不安全的情况
            synchronized (SingletonLazy.class) {
                if (singletonLazy == null) {
                    singletonLazy = new SingletonLazy();
                }
            }
        }
        return singletonLazy;
    }

    private SingletonLazy() {

    }
}

public class Demo {

    public static void main(String[] args) {

    }
}
